package com.shujia.final_;


public class Person {

    /*
    对于类属性而言，要么在静态代码块中初始化，要么在声明该属性时初始化。
    对于实例属性，要么在非静态代码块中指定初始值。要么在定义时、或构造器中指定初始值。
     */
    // 静态的final属性, 在加载类的时候就要赋值
    static final int height;
    static final String name = "zs";

    // 非静态属性使用final修饰, 对象创建的时候就一定要对这些属性赋值
    // 并且只能赋值一次
    final int weight;
    final int age = 20;
    final String hobby;

    String grade;


    public Person() {
        this.hobby = "篮球";
    }

    public Person(String hobby) {
        this.hobby = hobby;
    }

    static {
        height = 180;
        // final修饰的变量, 只能初始化一次
        // height = 185;
        // name = "lz";
    }

    {
        weight = 60;
        // weight = 70;
    }

    public static void main(String[] args) {
        Person person = new Person();
        person.play();
    }

    public void play() {
        // 使用final修饰局部变量要在使用前进行赋值，且只能赋值一次。
        final String game;
        game = "lol";
        // game = "农药";
        System.out.println(game);

        /*
        当使用final修饰基本数据类型变时，不能对其重新赋值，不能被改变。
        但对引用类型的变量而言，它仅仅保存的是一个引用，final只能保证他的地址不变，
        所以final修饰的引用类型属性值是可以修改的。
         */
        final Person person = new Person();
        Person person1 = new Person();

        // person = person1;

        System.out.println(person.hobby);
        // 属性使用final修饰, 所以不能赋值, 跟对象使用final修饰是没有关系的
        // person.hobby = "羽毛球";

        System.out.println(person.grade);

        person.grade = "20期";
        person.grade = "21期";
        person.grade = "22期";

        System.out.println(person.grade);

    }
}
